%%%-------------------------------------------------------------------
%%% @author GAME4
%%% @copyright (C) 2018, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 11. 五月 2018 16:05
%%%-------------------------------------------------------------------
-author("GAME4").

%% Serialize Tags
%% int32整数
-define(TAG_INTEGER, $i).

%% int64 整数
-define(TAG_LONG, $l).

%% 浮点数 IEEE754
-define(TAG_DOUBLE, $d).

%% nan IEEE754
-define(TAG_NAN, $N).

%% infinity IEEE754
-define(TAG_INFINITY, $I).

%% 布尔值
-define(TAG_TRUE, $t).
-define(TAG_FALSE, $f).

%% 空字符串
-define(TAG_EMPTY, $e).

%% 字符串
-define(TAG_STRING, $s).

%% UTF8编码字符串
-define(TAG_UTF8CHAR, $u).

%% 二进制数据
-define(TAG_BYTES, $b).

%% 全球唯一标识符
-define(TAG_GUID, $g).

%% 日期
-define(TAG_DATE, $D).

%% 时间
-define(TAG_TIME, $T).

%% UTC时间
-define(TAG_UTC, $Z).

%% null数据，空指针
-define(TAG_NULL, $n).

-define(TAG_LIST, $a).
-define(TAG_MAP, $m).
-define(TAG_CLASS, $c).
-define(TAG_OBJECT, $o).
-define(TAG_REF, $r).

%% Serialize Marks
-define(TAG_POS, $+).
-define(TAG_NEG, $-).
-define(TAG_SEMICOLON, $;).
-define(TAG_OPENBRACE, ${).
-define(TAG_CLOSEBRACE, $}).
-define(TAG_QUOTE, $").
-define(TAG_POINT, $.).

%% Protocol Tags
-define(TAG_FUNCTIONS, $F).
-define(TAG_CALL, $C).
-define(TAG_RESULT, $R).
-define(TAG_ARGUMENT, $A).
-define(TAG_ERROR, $E).
-define(TAG_END, $z).

-export_type([hprose_protocol/0, date/0, time/0]).

%% hprose 协议
-type hprose_protocol() :: binary()|list().

-type date() :: Date ::
{Year :: non_neg_integer(), Month :: non_neg_integer(), Day :: non_neg_integer()}.

-type time() :: Time ::
{Hour :: non_neg_integer(), Minute :: non_neg_integer(), Seconds :: non_neg_integer()}
|{Hour :: non_neg_integer(), Minute :: non_neg_integer(), Seconds :: non_neg_integer()}.


-callback handle_call(CallName, Args) -> Result when
  CallName :: binary(),
  Args :: list(),
  Result :: {?TAG_RESULT, iolist()}|{?TAG_ERROR, iolist()}.